package com.wpzf.system.service.impl;

import com.wpzf.common.core.constant.UserConstants;
import com.wpzf.common.core.exception.ServiceException;
import com.wpzf.common.core.utils.SpringUtils;
import com.wpzf.common.core.utils.StringUtils;
import com.wpzf.common.datascope.annotation.DataScope;
import com.wpzf.common.security.utils.SecurityUtils;
import com.wpzf.system.api.domain.SysUserPlatformRole;
import com.wpzf.system.domain.SysPlatform;
import com.wpzf.system.api.domain.SysUser;
import com.wpzf.system.domain.SysPlatformRole;
import com.wpzf.system.mapper.SysPlatformMapper;
import com.wpzf.system.mapper.SysUserPlatformRoleMapper;
import com.wpzf.system.service.ISysPlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

@Service
public class SysPlatformServiceImpl implements ISysPlatformService {
    @Autowired
    private SysPlatformMapper platformMapper;
    @Autowired
    private SysUserPlatformRoleMapper userPlatformRoleMapper;

    /**
     * 根据条件分页查询平台数据
     *
     * @param platform 平台信息
     * @return 平台数据集合信息
     */
    @Override
    @DataScope(deptAlias = "d")
    public List<SysPlatform> selectPlatformList(SysPlatform platform) {
        return platformMapper.selectPlatformList(platform);
    }

    /**
     * 根据用户ID查询平台
     *
     * @param userId 用户ID
     * @return 平台列表
     */
    @Override
    public List<SysPlatform> selectPlatformsByUserId(Long userId) {
        List<SysPlatform> userPlatforms = platformMapper.selectPlatformPermissionByUserId(userId);
        List<SysPlatform> platforms = selectPlatformAll();
        for (SysPlatform platform : platforms) {
            for (SysPlatform userPlatform : userPlatforms) {
                if (platform.getPlatformId().longValue() == userPlatform.getPlatformId().longValue()) {
                    platform.setFlag(true);
                    break;
                }
            }
        }
        return platforms;
    }

    /**
     * 根据用户ID查询权限
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    @Override
    public Set<String> selectPlatformPermissionByUserId(Long userId) {
        List<SysPlatform> perms = platformMapper.selectPlatformPermissionByUserId(userId);
        Set<String> permsSet = new HashSet<>();
        for (SysPlatform perm : perms) {
            if (StringUtils.isNotNull(perm)) {
                permsSet.addAll(Arrays.asList(perm.getPlatformKey().trim().split(",")));
            }
        }
        return permsSet;
    }

    /**
     * 查询所有平台
     *
     * @return 平台列表
     */
    @Override
    public List<SysPlatform> selectPlatformAll() {
        return SpringUtils.getAopProxy(this).selectPlatformList(new SysPlatform());
    }

    /**
     * 根据用户ID获取平台选择框列表
     *
     * @param userId 用户ID
     * @return 选中平台ID列表
     */
    @Override
    public List<Long> selectPlatformListByUserId(Long userId) {
        return platformMapper.selectPlatformListByUserId(userId);
    }

    /**
     * 通过平台ID查询平台
     *
     * @param platformId 平台ID
     * @return 平台对象信息
     */
    @Override
    public SysPlatform selectPlatformById(Long platformId) {
        return platformMapper.selectPlatformById(platformId);
    }

    /**
     * 校验平台名称是否唯一
     *
     * @param platform 平台信息
     * @return 结果
     */
    @Override
    public boolean checkPlatformNameUnique(SysPlatform platform) {
        Long platformId = StringUtils.isNull(platform.getPlatformId()) ? -1L : platform.getPlatformId();
        SysPlatform info = platformMapper.checkPlatformNameUnique(platform.getPlatformName());
        if (StringUtils.isNotNull(info) && info.getPlatformId().longValue() != platformId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 校验平台权限是否唯一
     *
     * @param platform 平台信息
     * @return 结果
     */
    @Override
    public boolean checkPlatformKeyUnique(SysPlatform platform) {
        Long platformId = StringUtils.isNull(platform.getPlatformId()) ? -1L : platform.getPlatformId();
        SysPlatform info = platformMapper.checkPlatformKeyUnique(platform.getPlatformKey());
        if (StringUtils.isNotNull(info) && info.getPlatformId().longValue() != platformId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 通过平台ID查询平台使用数量
     *
     * @param platformId 平台ID
     * @return 结果
     */
    @Override
    public int countUserPlatformByPlatformId(Long platformId) {
        return 0;// userPlatformMapper.countUserPlatformByPlatformId(platformId);
    }

    /**
     * 新增保存平台信息
     *
     * @param platform 平台信息
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertPlatform(SysPlatform platform) {
        // 新增平台信息
        platformMapper.insertPlatform(platform);
        return insertPlatformMenu(platform);
    }

    /**
     * 修改保存平台信息
     *
     * @param platform 平台信息
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updatePlatform(SysPlatform platform) {
        // 修改平台信息
        return platformMapper.updatePlatform(platform);
        // 删除平台与菜单关联
        //platformMenuMapper.deletePlatformMenuByPlatformId(platform.getPlatformId());
        //return insertPlatformMenu(platform);
    }

    /**
     * 修改平台状态
     *
     * @param platform 平台信息
     * @return 结果
     */
    @Override
    public int updatePlatformStatus(SysPlatform platform) {
        return platformMapper.updatePlatform(platform);
    }

    /**
     * 修改数据权限信息
     *
     * @param platform 平台信息
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int authDataScope(SysPlatform platform) {
        // 修改平台信息
        platformMapper.updatePlatform(platform);
        // 删除平台与部门关联
        //platformDeptMapper.deletePlatformDeptByPlatformId(platform.getPlatformId());
        // 新增平台和部门信息（数据权限）
        return insertPlatformDept(platform);
    }

    /**
     * 新增平台菜单信息
     *
     * @param platform 平台对象
     */
    public int insertPlatformMenu(SysPlatform platform) {
        int rows = 1;
//        // 新增用户与平台管理
//        List<SysPlatformMenu> list = new ArrayList<SysPlatformMenu>();
//        for (Long menuId : platform.getMenuIds())
//        {
//            SysPlatformMenu rm = new SysPlatformMenu();
//            rm.setPlatformId(platform.getPlatformId());
//            rm.setMenuId(menuId);
//            list.add(rm);
//        }
//        if (list.size() > 0)
//        {
//            rows = platformMenuMapper.batchPlatformMenu(list);
//        }
        return rows;
    }

    /**
     * 新增平台部门信息(数据权限)
     *
     * @param platform 平台对象
     */
    public int insertPlatformDept(SysPlatform platform) {
        int rows = 1;
//        // 新增平台与部门（数据权限）管理
//        List<SysPlatformDept> list = new ArrayList<SysPlatformDept>();
//        for (Long deptId : platform.getDeptIds())
//        {
//            SysPlatformDept rd = new SysPlatformDept();
//            rd.setPlatformId(platform.getPlatformId());
//            rd.setDeptId(deptId);
//            list.add(rd);
//        }
//        if (list.size() > 0)
//        {
//            rows = platformDeptMapper.batchPlatformDept(list);
//        }
        return rows;
    }

    /**
     * 通过平台ID删除平台
     *
     * @param platformId 平台ID
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deletePlatformById(Long platformId) {
        // 删除平台与菜单关联
        //platformMenuMapper.deletePlatformMenuByPlatformId(platformId);
        // 删除平台与部门关联
        //platformDeptMapper.deletePlatformDeptByPlatformId(platformId);
        userPlatformRoleMapper.deleteUserPlatformRoleByPlatformId(platformId);
        return platformMapper.deletePlatformById(platformId);
    }

    /**
     * 批量删除平台信息
     *
     * @param platformIds 需要删除的平台ID
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deletePlatformByIds(Long[] platformIds) {
        // 删除用户平台角色关联表信息
        //platformDeptMapper.deletePlatformDept(platformIds);
        userPlatformRoleMapper.deleteUserPlatformRoleByPlatformIds(platformIds);
        return platformMapper.deletePlatformByIds(platformIds);
    }

    /**
     * 取消授权用户平台
     *
     * @param userPlatform 用户和平台关联信息
     * @return 结果
     */
//    @Override
//    public int deleteAuthUser(SysUserPlatform userPlatform)
//    {
//        return userPlatformMapper.deleteUserPlatformInfo(userPlatform);
//    }

    /**
     * 批量取消授权用户平台
     *
     * @param platformId 平台ID
     * @param userIds    需要取消授权的用户数据ID
     * @return 结果
     */
    @Override
    public int deleteAuthUsers(Long platformId, Long[] userIds) {
        return 0;// userPlatformMapper.deleteUserPlatformInfos(platformId, userIds);
    }

    /**
     * 批量选择授权用户平台
     *
     * @param platformId 平台ID
     * @param userIds    需要授权的用户数据ID
     * @return 结果
     */
    @Override
    public int insertAuthUsers(Long platformId, Long[] userIds) {
        // 新增用户与平台管理
//        List<SysUserPlatform> list = new ArrayList<SysUserPlatform>();
//        for (Long userId : userIds)
//        {
//            SysUserPlatform ur = new SysUserPlatform();
//            ur.setUserId(userId);
//            ur.setPlatformId(platformId);
//            list.add(ur);
//        }
//        return userPlatformMapper.batchUserPlatform(list);
        return 0;
    }

    @Override
    public List<SysPlatformRole> getUserPlatformRoleByUserId(Long userId) {
        if(SecurityUtils.isAdmin(userId)){
            return userPlatformRoleMapper.getUserPlatformRoleAll();
        }else {
            return userPlatformRoleMapper.getUserPlatformRoleByUserId(userId);
        }
    }
    @Override
    public List<SysUserPlatformRole> getUserPlatformRole(Long userId) {

        return userPlatformRoleMapper.getUserPlatformRole(userId);
    }
    @Override
    public Long getRoleByUserPlatform(SysUserPlatformRole userPlatformRole) {
        return userPlatformRoleMapper.getRoleByUserPlatform(userPlatformRole);
    }
}
